#ifndef __OSTIME_H__
#define __OSTIME_H__

/*********************************************************************
 * INCLUDES
 */

#include "thread.h"

#ifdef __cplusplus
extern "C" {
#endif

#if (SAL_TIME == _ENABLE)

/*********************************************************************
 *  EXTERNAL VARIABLES
 */

/*********************************************************************
 * MACROS
 */

/*********************************************************************
 * TYPES
 */

typedef uint64_t ostime_t;

typedef struct _os_date
{
    uint16_t  usYear;       /* Year */
    uint8_t   ucMonth;      /* Month.    [1-12] */
    uint8_t   ucDay;        /* Day.      [1-31] */
    uint8_t   ucHour;       /* Hours.    [0-23] */
    uint8_t   ucMinute;     /* Minutes.  [0-59] */
    uint8_t   ucSecond;     /* Seconds.  [0-60] (1 leap second) */
    uint8_t   ucWeek;       /* Day of week.    [1-7] */
    uint32_t  uiMilliSecond;
} OS_DATE_S;

/* 系统时间基本操作 */
typedef struct _os_time_base
{
    MOD_INFO_S stInfo;
    ostime_t(*pfOSTickGet)(void);
    ostime_t(*pfOSSysTimeGet)(void);
    ostime_t(*pfOSTimeGet)(void);
    int32_t (*pfOSTimeSet)(ostime_t);
    void    (*pfOSDateGet)(OS_DATE_S *);
    ostime_t(*pfOSDate2TimeStamp)(OS_DATE_S *);
    void    (*pfOSTimeStamp2Date)(ostime_t, OS_DATE_S *);
    void    (*pfOSSleep)(uint32_t);
    void    (*pfOSSleepus)(uint32_t);
    osStatus_t (*pfOSDelay)(uint32_t);
    osStatus_t (*pfOSDelayUntil)(uint64_t);
} OSTIME_BASE_S;

/*********************************************************************
 * FUNCTIONS
 */

/**
 *   @Description: 系统时间模块安装
 *   @param : NA
 *   @return: _OK/_ERR
 */
int32_t osTimeInstall(void);

/**
 *   @Description: 系统时间模块卸载
 *   @param : NA
 *   @return: _OK/_ERR
 */
int32_t osTimeUninstall(void);

/**
 *   @Description: 获取系统启动运行时间戳，单位毫秒
 *   @param : NA
 *   @return: 从系统启动到现在的毫秒数
 */
ostime_t osSysTimeGet(void);
/**
 *   @Description: 获取时间戳，单位微秒
 *   @param : NA
 *   @return: 格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总微秒数
 */
ostime_t osTickGet(void);

/**
 *   @Description: 获取时间戳，单位毫秒
 *   @param : NA
 *   @return: 格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数
 */
ostime_t osTimeGet(void);

/**
 *   @Description: 设置时间戳
 *   @param : ulTimeStamp - 入参，时间戳，毫秒
 *   @return: 错误信息
 */
int32_t osTimeSet(ostime_t ulTimeStamp);

/**
 *   @Description: 获取日期
 *   @param : pstDate - 出参，日期
 *   @return: NA
 */
void osDateGet(OS_DATE_S *pstDate);

/**
 *   @Description: 日期转换为时间戳
 *   @param : pstDate - 入参，日期
 *   @return: 时间戳
 */
ostime_t osDate2TimeStamp(OS_DATE_S *pstDate);

/**
 *   @Description: 时间戳转换为日期
 *   @param : uiTimeStamp - 入参，时间戳
 *   @param : pstDate - 出参，日期
 *   @return: NA
 */
void osTimeStamp2Date(ostime_t ulTimeStamp, OS_DATE_S *pstDate);

/**
 *   @Description: 休眠，单位秒
 *   @param : uiTimeSec - 入参，休眠时间
 *   @return: NA
 */
void osSleep(uint32_t uiTimeSec);

/**
 *   @Description: 休眠，单位微秒
 *   @param : uiTimeUs - 入参，休眠时间
 *   @return: NA
 */
void osSleepus(uint32_t uiTimeUs);

//  ==== Generic Wait Functions ====

/// Wait for Timeout (Time Delay).
/// \param[in]     ticks         \ref CMSIS_RTOS_TimeOutValue "time ticks" value
/// \return status code that indicates the execution status of the function.
osStatus_t osDelay (uint32_t ticks);

/// Wait until specified time.
/// \param[in]     ticks         absolute time in ticks
/// \return status code that indicates the execution status of the function.
osStatus_t osDelayUntil (uint64_t ticks);

#endif  // SAL_TIME == ENABlE

#ifdef __cplusplus
}
#endif /* end of __cplusplus */

#endif

/************************************** The End Of File **************************************/

